package com.ebook.util;

import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;

import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


/**
 * 邮件发送功能类
 * @author   潘吉友
 * @Date	 2013-3-20
 */
public class SendAttachment {
	
	private static Log logger = LogFactory.getLog(SendAttachment.class); 
	/**
	 * 邮件发送模块
	 * @param email     邮箱地址
	 * @param checkcode 动态核对码
	 * @return true：成功；false：失败
	*/
	public static boolean sendPswByMail(String email,String checkcode) {
		try {
			
			
			// 创建 PRoperties ，里面包含了发送邮件服务器的地址。

			Properties mailProps = new Properties();
			mailProps.put("mail.smtp.starttls.enable", "true");   
			mailProps.put("mail.smtp.host", "smtp.live.com"); // "mail.smtp.host"随便叫啥都行，"192.0.0.1"必须是真实可用的。
			mailProps.put("mail.smtp.port", "25"); 
			mailProps.put("mail.smtp.auth", "true");  
			 
			  // 判断是否需要身份认证    
		      MyAuthenticator authenticator = null;    
		      // 如果需要身份认证，则创建一个密码验证器    
		        authenticator = new MyAuthenticator("idservice@knoceano.com","KnoService");    
		        
			// 创建 session

			Session mailSession = Session.getDefaultInstance(mailProps,authenticator);

			// 创建 邮件的message，message对象包含了邮件众多有的部件，都是封装成了set方法去设置的

			MimeMessage message = new MimeMessage(mailSession);
			
			//设置中文昵称
			String nick="";   
	        try {   
	            nick=javax.mail.internet.MimeUtility.encodeText("知域电子书");   
	        } catch (UnsupportedEncodingException e) {   
	            e.printStackTrace();   
	        }  

			// 设置发信人
			message.setFrom(new InternetAddress(nick+"<idservice@knoceano.com>"));
			
			// 收信人
			message.setRecipient(Message.RecipientType.TO, new InternetAddress(email));
					

			// 邮件标题
			message.setSubject("重置密码"); 

			// 创建
			// Mimemultipart，这是包含多个附件是必须创建的。假如只有一个内容，没有附件，可以直接用message.setText(String
			// str)
			// 去写信的内容，比较方便。附件等于是要创建多个内容，往下看更清楚。

			MimeMultipart multi = new MimeMultipart();

			// 创建
			// BodyPart，主要作用是将以后创建的n个内容加入MimeMultipart.也就是可以发n个附件。我这里有2个BodyPart.

			BodyPart textBodyPart = new MimeBodyPart(); // 第一个BodyPart.主要写一些一般的信件内容。
			textBodyPart.setContent(new StringBuilder().append("<div>")
					.append(email)
					.append("，您好：<br>")
					.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;感谢您使用知域电子书！<br>")
					.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请点击如下链接，以完成您帐号密码的重置：<br>")
					.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;")
					.append("<a href=\"http://220.166.64.85:51206/ebook-server/user/editPsw?email=")
					.append(email)
					.append("&checkcode=")
					.append(checkcode)
					.append("\">")
					.append("http://www.knoceano.com/editPsw?email=")
					.append(email)
					.append("&checkcode=")
					.append(checkcode)
					.append("</a><br>")
					.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(如果不能点击该链接地址，请复制并粘贴到浏览器的地址输入框)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;知域电子书<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;")
					.append(DateUtil.SDF1.format(new Date())).append("</div>").toString()
					                , "text/html;charset=utf-8");   

//			textBodyPart.setText("请点击连接,修改密码 ：http://192.168.1.106:8080/ebook-server/user/editPsw?email="+email+"&username="+username);
			
			// 压入第一个BodyPart到MimeMultipart对象中。checkcode=bmWo 

			multi.addBodyPart(textBodyPart);

			// 创建第二个BodyPart,是一个FileDAtaSource

		//	FileDataSource fds = new FileDataSource("c:\\myattachment.txt"); // 必须存在的文档，否则throw异常。

		//	BodyPart fileBodyPart = new MimeBodyPart(); // 第二个BodyPart
		//	fileBodyPart.setDataHandler(new DataHandler(fds)); // 字符流形式装入文件
			//fileBodyPart.setFileName("report.xls"); // 设置文件名，可以不是原来的文件名。

			// 不讲了，同第一个BodyPart.
	//		multi.addBodyPart(fileBodyPart);

			// MimeMultPart作为Content加入message

			message.setContent(multi);

			// 所有以上的工作必须保存。

			message.saveChanges();

			// 发送，利用Transport类，它是SMTP的邮件发送协议，

			Transport.send(message);
			return true;
		} catch (Exception exc) {
			logger.error("发送邮件错误" + exc);
			exc.printStackTrace();
			return false;
		}
	}
	
	public static void main(String[] args) {
//		for(int i=0;i<10;i++){
		long start = System.currentTimeMillis();
			if(!SendAttachment.sendPswByMail("pjyjpy@126.com", "536485")){
				System.out.println("发送邮件错误");
			}
			long end = System.currentTimeMillis();
			System.out.println(end-start);
//		}
		
//		String email = "pjyjpy@126.com";
//		String checkcode = "pjyjpy";
		
	}
}